<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>8.多级作用域嵌套详解</title>
</head>

<body> 
  <script>
    /*let arr = [];
    for (let i = 0; i < 4; i++) {
      arr.push((() => i));
    }
    console.log(arr[3]());*/ //3 （数组中存储的是函数，执行第三个函数）
    // 如果使用var声明将是4 但是因为使用var定义的i会被保存在window中，即便方法体创建了新的作用域，结果仍旧是4
    //自行构建闭包
    var arr = [];
    for (var i = 0; i < 4; i++) {
      (function (a) {
        // 定义成立即执行的函数，会形成新的作用域
        // 将定义的子函数存储在数组中，环境会被保留

        arr.push(() => a);
      })(i);
    }
    // 调用arr[3]())不会寻找到window中存储的i，而是调用数组中存储的函数引用
    // 因为子函数被外部环境引用，子函数的环境会被保留，最终会找到到作用域内的a
    console.log(arr[3]()); 
  </script>
</body>

</html>